import requests
import json
import logging
from src.models.models import SystemConfig

logger = logging.getLogger(__name__)


def calculate_remote_folder_id(download_directory):
    """
    根据下载目录路径，迭代请求远程API获取最终的parent_folder_id。
    返回计算出的ID字符串，如果失败则返回None。
    此函数不负责数据库操作，也不负责更新 Subscription 模型的 parent_folder_id 字段。
    """
    # 从系统配置中获取远程API相关参数
    remote_host = SystemConfig.get_config('xunlei_nas_host', '')
    remote_token = SystemConfig.get_config('xunlei_nas_credential', '')
    initial_parent_id = SystemConfig.get_config('xunlei_nas_initial_dir_id', '')
    device_space_id = SystemConfig.get_config('xunlei_nas_device_space_id', '')

    if not initial_parent_id or initial_parent_id == '':
        logger.error("远程API认证Token未配置或为默认值!")
        return None  # 表示失败

    # 清理并分割目录路径
    # 移除开头的斜杠，并按斜杠分割，过滤空字符串
    path_components = [comp for comp in download_directory.strip('/').split('/') if comp]

    # 如果下载目录为空（例如只有 '/'），则直接返回初始父ID
    if not path_components:
        return initial_parent_id

    current_parent_id = initial_parent_id

    headers = {
        'Content-Type': 'application/json',
        'pan-auth': remote_token,
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:139.0) Gecko/20100101 Firefox/139.0',
        'Accept': 'application/json, text/plain, */*',
        'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
        'Accept-Encoding': 'gzip, deflate, br',
    }

    api_url = f"{remote_host}/webman/3rdparty/pan-xunlei-com/index.cgi/drive/v1/files"

    try:
        for i, component_name in enumerate(path_components):
            payload = {
                "parent_id": current_parent_id,
                "name": component_name,
                "space": device_space_id,
                "kind": "drive#folder"
            }
            logger.info(f"请求远程文件夹ID：目录组件 '{component_name}'，父ID：'{current_parent_id}'")
            response = requests.post(api_url, headers=headers, data=json.dumps(payload), timeout=10)
            response.raise_for_status()  # 如果响应状态码是 4xx 或 5xx，则抛出 HTTPError 异常

            response_data = response.json()

            # 检查返回值结构，确保file和id存在
            if 'file' in response_data and 'id' in response_data['file']:
                current_parent_id = response_data['file']['id']
                logger.info(f"成功获取到 '{component_name}' 的ID：{current_parent_id}")
            else:
                logger.error(f"获取目录组件 '{component_name}' 的ID失败。响应数据：{response_data}")
                return None  # 表示失败

        return current_parent_id  # 返回最终的文件夹ID
    except requests.exceptions.RequestException as e:
        logger.error(f"远程API请求失败：{e}")
        return None
    except Exception as e:
        logger.error(f"获取远程文件夹ID时发生意外错误：{e}")
        return None

